/**
 * File:   GetNodesAction.java
 * Author: Gvennet
 */
package gui.actions;

import dht.identifier.identifier.Identifier;
import dht.identifier.identifier.Identifiers;
import dht.network.Network;
import dht.node.DHTNodeModel;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.net.InetAddress;
import java.text.ParseException;

/**
 * todo write javadoc
 */
public final class GetNodesAction extends AbstractAction
{

	private final DHTNodeModel nodeModel;

	private final JTable nodeTable;

	private final Network network;

	public GetNodesAction(DHTNodeModel nodeModel, JTable nodeTable, Network network)
	{
		super("Найти узлы");
		putValue(SHORT_DESCRIPTION, "Найти узлы, ближайшие к заданному");
		putValue(MNEMONIC_KEY, KeyEvent.VK_F);
		this.nodeModel = nodeModel;
		this.nodeTable = nodeTable;
		this.network = network;
	}


	public void actionPerformed(ActionEvent e)
	{

		int index = nodeTable.getSelectedRow();
		if (index >= 0)
		{
			InetAddress ia = nodeModel.getInetAddress(index);
			int port = nodeModel.getPort(index);

			Identifier id = null;
			String str_id = JOptionPane.showInputDialog(null, "Введите идентификатор узла, соседей которого требуется найти", network.getLocalId());
			if (str_id != null)
			{
				try
				{
					id = Identifiers.convertFromString(str_id);
				}
				catch (ParseException e1)
				{
					JOptionPane.showMessageDialog(null, "Введённая Вами строка не является идентификатором", "Ошибка", JOptionPane.ERROR_MESSAGE);
				}
			}

			try
			{
				if (id != null)
				{
					network.sendGetNodesRequest(ia, port, id);
				}
			}
			catch (IOException e1)
			{
				//do nothing
			}
		}
	}

}
